#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <signal.h>

// 发送信号
// int kill(pid_t pid, int sig);

// typedef void (*sighandler_t)(int);
// SIG_IGN忽略   SIG_DFL默认

// 捕捉信号监听信号 signum信号值  handler回调函数
// sighandler_t signal(int signum, sighandler_t handler);

void sighandler1(int arg)
{
    printf("捕捉到信号 arg:%d\n", arg);
}
void sighandler2(int arg)
{
    printf("捕捉到信号 arg:%d\n", arg);
}
void sighandler3(int arg)
{
    printf("捕捉到信号 arg:%d\n", arg);
}

void sighandler1(int arg)
{
    printf("捕获到信号 arg = %d\n", arg);
}

int main()
{
    pid_t pid = fork();

    if (pid == -1)
    {
        perror("fork error");
    }

    // 子进程
    if (pid == 0)
    {
        // 捕获信号  异步的（不阻塞）
        signal(SIGINT, sighandler1);
        signal(SIGUSR1, sighandler2);
        signal(SIGCHLD, sighandler3);
        while (1)
        {
            printf("apple! child pid = %d ppid = %d\n", getpid(), getppid());
            sleep(1);
        }
    }

    if (pid > 0)
    {
        sleep(3);
        kill(pid, SIGINT);

        sleep(3);
        kill(pid, SIGUSR1);

        sleep(3);
        kill(pid, SIGCHLD);

        sleep(3);
        kill(pid, SIGKILL);

        int status;
        wait(&status);
        printf("%d %d %d %d\n", WIFEXITED(status), WEXITSTATUS(status), WIFSIGNALED(status), WTERMSIG(status));
    }
    return 0;
}